#include "SqliteHelper.h"


using namespace Moolink;

QSqlDatabase database;

SqliteHelper::SqliteHelper()
{
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName(searchDbFile());
}


QString SqliteHelper::searchDbFile()
{
    QString binDir="./";//QCoreApplication::applicationDirPath();
    QString fileName("Database.sqlite");

    QStringList searchList;
    searchList.append(binDir);
    searchList.append(binDir+"data/");
    searchList.append(binDir+"../data/");


    foreach (QString dir, searchList)
    {
        QFile file(dir+fileName);
        if (file.exists())
        {
            // found
            fileName=QDir(file.fileName()).canonicalPath();
            qDebug("Using DataBase file %s",qPrintable(fileName));
            return fileName;
        }
    }

    // not found
    foreach (QString dir, searchList)
    {
        qWarning("%s%s not found",qPrintable(dir),qPrintable(fileName));
    }
    qFatal("Cannot find DataBase file %s",qPrintable(fileName));
    return 0;
}

bool SqliteHelper::Open()
{
    if (database.open())
    {
        //qDebug() << "Succeed to connect database." ;
        return true;
    }
    else
    {
        qDebug() << "connect database error." ;
        return false;
    }
    return true;
}

void SqliteHelper::Close()
{
    database.close();
}


QVariantList SqliteHelper::Query(QString sql,int page,int pagenum)
{
    QVariantList List;
    QVariantMap Object;
    if(Open())
    {
        QSqlQuery sql_query;
        sql_query.exec(sql+" limit "+QString::number(pagenum)+" offset "+QString::number(pagenum*page));
        if(!sql_query.exec())
        {
            //qDebug()<<sql_query.lastError();
            //return -2;
        }
        else
        {
            while(sql_query.next())
            {
                Object.clear();
                for(int i=0;i<sql_query.record().count();i++)
                {
                    Object.insert(sql_query.record().field(i).name(), sql_query.record().field(i).value());
                    //qDebug()<<sql_query.record().field(i).name()<<sql_query.record().field(i).value();
                }
                List.append(Object);

            }
        }

    }

    Close();
    return List;
}


bool SqliteHelper::INSERT(QString table,QVariantMap data)
{
    bool execOk=false;


    if(Open())
    {
        QSqlQuery sql_query;
//        QStringList byteArrayKey;
        QString sql="";
        QString spit="";
        QString sqlKeys="";
        QString sqlValues="";
        if(data.keys().size()>0)
        {
            for(int i=0;i<data.keys().size();i++)
            {
                (i==0) ? spit="" : spit=",";
                sqlKeys+=spit+data.keys().at(i);
//                if(data.values().at(i).type()==QVariant::Type::String)
//                {
                    sqlValues+=spit+"'"+data[data.keys().at(i)].toString()+"'";
//                }
//                else if(data.values().at(i).type()==QVariant::Type::ByteArray)
//                {
//                    sqlValues+=spit+"?";
//                    byteArrayKey.append(data.keys().at(i));
////                    int size = data[data.keys().at(i)].toByteArray().size();
////                    sql_query.bindValue(1, data, QSql::Binary);
//                }
            }
            sql="insert into "+table+"("+sqlKeys+") values("+sqlValues+");";
//            sql_query.prepare(sql);

//            for(int i=0;i<byteArrayKey.size();i++)
//            {
//                //qDebug()<<byteArrayKey.at(i);
//                sql_query.bindValue(i, data[byteArrayKey.at(i)].toByteArray(), QSql::Binary);
//            }

            //qDebug()<<sql;

            if(sql_query.exec(sql)) execOk=true;// else qDebug()<<sql_query.lastError();

        }
    }

    Close();
    return execOk;
}


bool SqliteHelper::UPDATE(QString table,QVariantMap data)
{
    bool execOk=false;


    if(Open())
    {
        QSqlQuery sql_query;
//        QStringList byteArrayKey;
        QString sql="";
        QString spit="";
        QString sqlKeys="";
        QString sqlValues="";
        if(data.keys().size()>0)
        {
            for(int i=0;i<data.keys().size();i++)
            {
                (i==0) ? spit="" : spit=", ";
                if(data.keys().at(i)!="id")
                {
                    sqlKeys+=spit+data.keys().at(i)+" = '"+data[data.keys().at(i)].toString()+"'";
                }

            }
            sql="update "+table+" set " +sqlKeys+ " where id="+data["id"].toString()+";";


            //qDebug()<<sql;

            if(sql_query.exec(sql)) execOk=true;// else qDebug()<<sql_query.lastError();

        }
    }

    Close();
    return execOk;
}







bool SqliteHelper::EXEC(QString sql)
{
    bool execOk=false;
    if(Open())
    {
        //qDebug()<<sql;
        QSqlQuery sql_query;
        if(sql_query.exec(sql))
        {
            execOk=true;
        }
        //else qDebug()<<sql_query.lastError();
    }

    Close();
    return execOk;
}




int SqliteHelper::Creat(QString sql)
{
    //创建表格
    QSqlQuery sql_query;
    if(!sql_query.exec("create table student(id int primary key, name text, age int)"))
    {
        //qDebug() << "Error: Fail to create table."<< sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }
    return 0;
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////建立并打开数据库
//QSqlDatabase database;
//database = QSqlDatabase::addDatabase("QSQLITE");
//database.setDatabaseName("MyDataBase.db");
//if (!database.open())
//{
//    qDebug() << "Error: Failed to connect database." << database.lastError();
//}
//else
//{
//    qDebug() << "Succeed to connect database." ;
//}

////创建表格
//QSqlQuery sql_query;
//if(!sql_query.exec("create table student(id int primary key, name text, age int)"))
//{
//    qDebug() << "Error: Fail to create table."<< sql_query.lastError();
//}
//else
//{
//    qDebug() << "Table created!";
//}

////插入数据
//if(!sql_query.exec("INSERT INTO student VALUES(1, \"Wang\", 23)"))
//{
//    qDebug() << sql_query.lastError();
//}
//else
//{
//    qDebug() << "inserted Wang!";
//}
//if(!sql_query.exec("INSERT INTO student VALUES(2, \"Li\", 23)"))
//{
//    qDebug() << sql_query.lastError();
//}
//else
//{
//    qDebug() << "inserted Li!";
//}

////修改数据
//sql_query.exec("update student set name = \"QT\" where id = 1");
//if(!sql_query.exec())
//{
//    qDebug() << sql_query.lastError();
//}
//else
//{
//    qDebug() << "updated!";
//}

////查询数据
//sql_query.exec("select * from student");
//if(!sql_query.exec())
//{
//    qDebug()<<sql_query.lastError();
//}
//else
//{
//    while(sql_query.next())
//    {
//        int id = sql_query.value(0).toInt();
//        QString name = sql_query.value(1).toString();
//        int age = sql_query.value(2).toInt();
//        qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
//    }
//}

////删除数据
//sql_query.exec("delete from student where id = 1");
//if(!sql_query.exec())
//{
//    qDebug()<<sql_query.lastError();
//}
//else
//{
//    qDebug()<<"deleted!";
//}

////删除表格
//sql_query.exec("drop table student");
//if(sql_query.exec())
//{
//    qDebug() << sql_query.lastError();
//}
//else
//{
//    qDebug() << "table cleared";
//}

////关闭数据库
//database.close();
//————————————————
//版权声明：本文为CSDN博主「姜亚轲」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
//原文链接：https://blog.csdn.net/weixin_41656968/article/details/80473137











//////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//QSqlDatabase SqliteReader::s_db;

///************************************
// *@func:   SqliteReader::read
// *@brief:  返回值中已拿到表名 列名 单元格数据信息
// *@params: const QString & name 数据库名
// *@return: std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>>
//************************************/
//std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>>
//SqliteReader::read(const QString& name)
//{
//    std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>> values{};

//    // 打开数据库
//    s_db = QSqlDatabase::addDatabase("QSQLITE");
//    s_db.setDatabaseName(name);
//    if (!s_db.open())
//    {
//        qDebug() << s_db.lastError().text();
//        return values;
//    }

//    // 读数据
//    for (const auto& tableName : s_db.tables())
//    {
//        QString selectSql = QString("select * from %1;").arg(tableName);
//        QSqlQuery query{};
//        if (!query.exec(selectSql))
//        {
//            qDebug() << query.lastError().text();
//            continue;
//        }

//        std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>> tableDatas;
//        while (query.next())
//        {
//            std::vector<std::tuple<QVariant::Type, QString, QString>> singleResultInfos{}; // 单条数据信息
//            for (int i = 0; i < query.record().count(); ++i)
//            {
//                auto type = query.record().field(i).type();
//                auto name = query.record().fieldName(i);
//                auto value = query.record().value(i).toString();
//                singleResultInfos.emplace_back(std::make_tuple(type, name, value));
//            }

//            tableDatas.emplace_back(std::move(singleResultInfos));
//        }
//        values[tableName] = std::move(tableDatas);
//    }

//    return std::move(values);
//}
